聊聊jdbc socketTimeout的设置 | 您所在的位置:网站首页 › java connect time out › 聊聊jdbc socketTimeout的设置 |
序 本文主要介绍下jdbc的socket timeout的设置 jdbc timeout类别主要有如下几个类别 ![]() 上面的不同级别的timeout越往下优先级越高,也就是说如果下面的配置比上面的配置值小的话,则会优先触发timeout,那么相当于上面的配置值就”失效”了。 jdbc socket timeout这个不同数据的jdbc driver实现不一样 mysql代码语言:javascript复制jdbc:mysql://localhost:3306/ag_admin?useUnicode=true;characterEncoding=UTF8&connectTimeout=60000&socketTimeout=60000通过url参数传递即可 pg代码语言:javascript复制jdbc:postgresql://localhost/test?user=fred&password=secret&&connectTimeout=60&socketTimeout=60pg也是通过url传递,不过它的单位与mysql不同,mysql是毫秒,而pg是秒 oracleoracle需要通过oracle.jdbc.ReadTimeout参数来设置,连接超时参数是oracle.net.CONNECT_TIMEOUT 通过properties设置 Class.forName("oracle.jdbc.driver.OracleDriver"); Properties props = new Properties() ; props.put( "user" , "test_schema") ; props.put( "password" , "pwd") ; props.put( "oracle.net.CONNECT_TIMEOUT" , "10000000") ; props.put( "oracle.jdbc.ReadTimeout" , "2000" ) ; Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@10.0.1.9:1521:orcl" , props ) ;通过环境变量设置 String readTimeout = "10000"; // ms System.setProperty("oracle.jdbc.ReadTimeout", readTimeout); Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection(jdbcUrl, user, pwd); 注意需要在connection连接之前设置环境变量tomcat jdbc pool 一般我们不直接使用jdbc connection,而是使用连接池。由于tomcat jdbc pool是springboot默认使用的数据库连接池,这里就讲述一下如何在tomcat jdbc pool下设置。 spring.datasource.tomcat.connectionProperties=oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000 注意,这里是分号分隔,单位是毫秒,这里可以根据各自的情况配置前缀(tomcat jdbc连接池的话,默认是spring.datasource.tomcat),可以自定义,比如 @Bean @Qualifier("writeDataSource") @ConfigurationProperties(prefix = "spring.datasource.write") public DataSource writeDataSource() { return DataSourceBuilder.create().build(); } 假设你这里是自定义了prefix为spring.datasource.write,那么上述配置就变为 spring.datasource.write.connectionProperties=oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000 oracle.jdbc.ReadTimeout如果没有设置的话,driver里头默认是0oracle.jdbc.ReadTimeoutdriver内部将该值设置到oracle.net.READ_TIMEOUT变量上 oracle.net.nt.TcpNTAdapter代码语言:javascript复制 @Override public void setReadTimeoutIfRequired(final Properties properties) throws IOException, NetException { String s = ((Hashtable)properties).get("oracle.net.READ_TIMEOUT"); if (s == null) { s = "0"; } this.setOption(3, s); } public void setOption(int var1, Object var2) throws IOException, NetException { String var3; switch(var1) { case 0: var3 = (String)var2; this.socket.setTcpNoDelay(var3.equals("YES")); break; case 1: var3 = (String)var2; if(var3.equals("YES")) { this.socket.setKeepAlive(true); } case 2: default: break; case 3: this.sockTimeout = Integer.parseInt((String)var2); this.socket.setSoTimeout(this.sockTimeout); } }可用看到最后设置的是socket的soTimeout 实例代码语言:javascript复制 @Test public void testReadTimeout() throws SQLException { Connection connection = dataSource.getConnection(); String sql = "select * from demo_table"; PreparedStatement pstmt; try { pstmt = (PreparedStatement)connection.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); int col = rs.getMetaData().getColumnCount(); System.out.println("============================"); while (rs.next()) { for (int i = 1; i |
CopyRight 2018-2019 实验室设备网 版权所有 |